package com.atguigu.schedule.controller;

import com.atguigu.schedule.common.Result;
import com.atguigu.schedule.common.ResultCodeEnum;
import com.atguigu.schedule.pojo.SysUser;
import com.atguigu.schedule.service.SysUserService;
import com.atguigu.schedule.service.impl.SysUserServiceImpl;
import com.atguigu.schedule.util.MD5Util;
import com.atguigu.schedule.util.MyWebUtil;
import com.atguigu.schedule.util.WebUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yuezi2048
 * @version 1.0
 */
@WebServlet("/user/*")
public class SysUserController extends BaseController {
    private SysUserService userService = new SysUserServiceImpl();

    /**
     * 接收用户登录请求的业务方法（完成登录的业务接口）
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 接收用户名密码
        SysUser sysUser = WebUtil.readJson(request, SysUser.class);

        // 2. 调用服务层方法，根据用户名查询用户信息
        SysUser loginUser = userService.findUserName(sysUser.getUsername());

        Result result = null;

        if (loginUser == null) {
            // 用户名有误，跳转到用户名有误提示页
            result = Result.build(null, ResultCodeEnum.USERNAME_ERROR);
        } else if (!MD5Util.encrypt(sysUser.getUserPwd()).equals(loginUser.getUserPwd())) {
            // 密码有误，跳转到密码有误提示也
            result = Result.build(null, ResultCodeEnum.PASSWORD_ERROR);
        } else {
            // 登录成功，将用户的uid和username响应给客户端(复用原来的loginUser对象 清空密码将该对象发回去)
            Map<String, Object> data = new HashMap<>();
            loginUser.setUserPwd("");
            data.put("loginUser", loginUser);

            result = Result.ok(data);
        }

        WebUtil.writeJson(response, result);
    }

    /**
     * 接收用户注册请求的业务处理方法（接口 不是java的接口）
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.接收用户提交的参数，并将json参数转换为User对象获取信息
        SysUser registerUser = WebUtil.readJson(req, SysUser.class);


        // 2. 调用service层方法 完成注册功能
        // 将参数封装为SysUser对象中 再调用register方法时传入（后续框架会自动完成封装 传参 先养成习惯）
        // 为什么前端校验后，后端依然校验：考虑到并发情况下，如果同时为两个相同的用户进行注册，要求有一个注册失败
        int rows = userService.register(registerUser);

        // 3. 根据注册结果（成功 or 失败），做页面跳转
        Result result = Result.ok(null);
        if (rows < 1) {
            result = Result.build(null, ResultCodeEnum.USERNAME_USED);
        }
        WebUtil.writeJson(resp, result);
    }

    /**
     * 注册时接收要接受的用户名，校验用户名是否被占用的业务接口
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void checkUsernameUsed(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 接收用户名
        String username = req.getParameter("username");

        // 调用service层业务处理方法，查询是否有该用户
        SysUser sysUser = userService.findUserName(username);

        Result<Object> result = Result.ok(null);

        // 如果有，响应占用，否则响应可用
        if (sysUser != null) {
            result = Result.build(null, ResultCodeEnum.USERNAME_USED);
        }
//        // 将result对象转换为JSON串响应给客户端（ObjectMapper）,已封装为一个工具方法
//        ObjectMapper objectMapper = new ObjectMapper();
//        String info = objectMapper.writeValueAsString(result);
//
//        // 告诉客户端这是JSON串
//        resp.setContentType("application/json;charset=utf-8");
//        resp.getWriter().write(info);
        WebUtil.writeJson(resp, result); // 直接向客户返回JSON串，后续SpringMVC会封装为一个注解，了解即可

    }

}
